const express = require('express');
const sha1 = require('sha1');

const app = express();

/**
 * 验证服务器有效性
 * 1.微信服务器要知道开发者的服务器是哪个，在测试号管理页面填写url，使用ngrok内网穿透
 * 2.开发者服务器验证消息是否来自微信服务器，计算得出signature签名，和微信传过来的签名对比，如果一样，说明请求没有问题，来自微信服务器
 *    具体做法：
 *      将参与微信加密签名的三个参数（timestamp，nonce，网页配置的token）组合在一起，按照字典序排序
 *      将数组所有参数拼接成一个字符串，进行sha1加密
 *      加密完成就生成了一个signature，和微信发送过来的对比
 * {
 *   signature: 'ff28667ea02b943b69c5a667107c292d62f68ece', 微信的加密签名
 *   echostr: '8759792260944328443', 随机字符串
 *   timestamp: '1649170099', 时间戳
 *   nonce: '53896518' 随机数字
 * }
 */
app.use((req,res,next)=>{
  console.log(req.query)

  //解构赋值
  const {signature,echostr,timestamp,nonce} = req.query;
  const {token} = config

  const arr = [timestamp,nonce,token];
  const arrSort = arr.sort();
  // console.log(arrSort)
  const str = arr.join('')
  // console.log('str={}',str)
  const sha1Str = sha1(str)
  // console.log('sha1Str={}',sha1Str)
  if(sha1Str === signature){
    console.log('一样')
    //如果一样，返回echostr给微信服务器，contentType，只有这种返回才能配置成功
    res.contentType('text/plain;charset=utf-8')
    res.send(echostr)
  }else {
    res.end('error')
  }
})

//监听端口号
app.listen(80,()=> console.log('服务器启动成功了'))



const config = {
  token: 'whatever',
  appid: 'wxafe74965d2f92f1e',
  appsecret: '413171d52d642e4fa5ab50992d3957b6',
}
